package com.itfenghuang.day01;

public class Day01_作业 {
    public static void main(String[] args) {
        /**
         *          方法区是jvm管理内存的一块区域
         *
        1. 代码块是什么，分为哪几类，各自有什么特点？
            代码块就是{}  里面写代码

            局部代码块:  定义在方法中
            构造代码块:
                特点: 定义在类中,方法之外的代码块
                      在构造方法执行之前,系统会自动的调用对应的构造代码块
            静态代码块:
                特点:
                     修饰方法:变成静态方法,可以通过类名.方法名调用
                     修饰变量: 静态变量  该类所有的对象可以共享
                     修饰代码块:  静态代码块,在构造代码块执行之前被调用

        2. 子父类都有静态代码块、构造代码块、构造方法，那么他们六者之间的执行流程是什么？

                     父类的静态代码块--> 子类的静态代码块--> 父类的构造代码块
                     -->父类的构造方法-->子类的构造代码块-->子类的构造代码块

        3. 继承的好处、弊端分别是什么？

                 提高了代码的复用性
                 使类和类之间产生了关系,这种关系成了构成多态的前提,
                 但是提高了耦合性(高内聚,低耦合)

        4. Java中继承的注意事项是什么？我们什么时候使用继承?

             1.private 修饰的成员变量和成员方法是被子类继承的,但是
             因为private 的特殊性,所以不能再子类中访问
             2.子类不能去继承父类的构造方法,但是可以使用super关键字去调用

             只有当两个类的关系是is 的时候,才可以使用继承
             不能仅仅是为了获取某个功能,然后去随便的继承一个类

        5. this关键字和super关键字分别代表什么，以及他们各自的作用分别是什么？

         this调用构造方法,调用的是本类的构造方法,必须放在有效代码的第一行,
         super 调用构造方法,调用的是当前类的父类的构造方法,必须放在有效代码的第一行

         super  调用 父类的属性
         this   调用当前类的属性

        7. 为什么子类中所有的构造方法默认都会访问父类的空参构造？
        super() 如果没有显示声明,jvm默认给你添加上

        8. super关键字和this关键字可以在构造方法中共存吗？

                不行

        9. Overload和Override的区别是什么？方法重载能改变返回值类型吗？

         *    重写:  在继承关系下,子类对父类的方法的重新实现,方法名,参数列表,返回值类型都相同,访问修饰符只能扩大或相同
         *    重载:在同一类中,方法名相同,参数列表不同(个数,类型,顺序),与返回值无关

         10.final关键字可以做什么,有什么特点?

            可以修饰我们的类,方法,变量
               final修饰的成员变量
                    可以在声明成员变量的时候,也可以在构造方法进行初始化,
               final修饰局部变量
                    只能够初始化一次




        13.根据需求完成代码:
        1.定义动物类
        属性：
        年龄，颜色
        行为:
        eat(String something)方法(无具体行为,不同动物吃的方式和东西不一样,something表示吃的东西)
        生成空参有参构造，set和get方法

        2.定义狗类继承动物类
        行为:
        eat(String something)方法,看家lookHome方法(无参数)

        3.定义猫类继承动物类
        行为:eat(String something)方法,逮老鼠catchMouse方法(无参数)

        4.定义Person类
        属性：
        姓名，年龄
        行为：
        keepPet(Dog dog,String something)方法
        功能：喂养宠物狗，something表示喂养的东西
        行为：
        keepPet(Cat cat,String something)方法
        功能：喂养宠物猫，something表示喂养的东西
        生成空参有参构造，set和get方法

        5.测试以上方法
         */
        Cat1 cat1 = new Cat1();
        cat1.eat("鱼");
        Dog1 dog1 = new Dog1();
        dog1.eat("肉");

        Person person = new Person("爆爆",16);
        person.keepPet(cat1,"猫粮");
        person.keepPet(dog1,"狗粮");

    }
}
abstract class Animal{
    private String name;
    private  int  age;
    private String color;

    public Animal() {
    }
    public Animal(int age, String color) {
        this.age = age;
        this.color = color;
    }
    public abstract void  eat(String something);
    public abstract void  keepPet(String something);

    public abstract String getName();

}
class Cat1 extends Animal{

    @Override
    public void eat(String something) {
        System.out.println("猫吃"+something);
    }
    @Override
    public void keepPet(String something) {
        System.out.println("猫吃"+something);
    }
    @Override
    public String getName() {
        return "猫";
    }
}

class Dog1 extends  Animal{

    public void lookHome(){
        System.out.println("看家");
    }
    @Override
    public void eat(String something) {
        System.out.println("狗吃"+something);
    }
    @Override
    public void keepPet(String something) {
        System.out.println("狗吃"+something);
    }
    @Override
    public String getName() {
        return "狗";
    }
}

class Person {
    private String name;
    private  int  age;

    public Person() {
        super();
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    public  void  keepPet(Animal animal, String something){
               String name=animal.getName();
        System.out.println(this.name+"喂"+name+"吃"+something);
    }




}











